#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QKeyEvent>
#include <QMessageBox>
#include <QDesktopServices>
#include <QUrl>
#include <QSettings>
#include <QDebug>

#include "appsettings.h"
#include "aboutwindow.h"

#include "drawings/schemewindow.h"
#include "drawings/fluffywindow.h"
#include "drawings/exceptiondialog.h"

//Адрес багтрекера
const QString MainWindow::bugTrackerUrl("http://code.google.com/p/microdesigner/issues/list");

//Название организации
const QString MainWindow::companyName("JrezCorp");

//Приложение
const QString MainWindow::appicationName("microdesigner");

MainWindow::MainWindow() :
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //Настройка TabbedDocumentInterface (TDI)
    Q_FOREACH (QTabBar* tab, ui->mdiArea->findChildren<QTabBar *>())
    {
        tab->setTabsClosable(true);
        //не поддерживается
        //tab->setMovable(true);
        tab->setExpanding(false);
        connect(tab, SIGNAL(tabCloseRequested(int)),
                      this, SLOT(closeMdiTab(int)));
    }

    //Добавление событий к пунктам меню
    connect(ui->aCreate,SIGNAL(triggered()),
            this,SLOT(createSchemeClick()));
    connect(ui->aImageEditor,SIGNAL(triggered()),
            this, SLOT(createImageClick()));
    connect(ui->aBugReport,SIGNAL(triggered()),
            this,SLOT(reportBugClick()));
    connect(ui->aAbout,SIGNAL(triggered()),
            this, SLOT(aboutClick()));
    connect(ui->mdiArea,SIGNAL(subWindowActivated(QMdiSubWindow*)),
            this,SLOT(subWindowActivated(QMdiSubWindow*)));
    //Другие события
    //connect(ui->elementsPanel,SIGNAL(visibilityChanged(bool)),
    //        this,SLOT(elementsVisibleChanged(bool)));

    //восстановить положение и размеры окна
    QSettings settings(companyName, appicationName);
    if (settings.contains("geometry"))
        restoreGeometry(settings.value("geometry").toByteArray());
    if (settings.contains("state"))
        restoreState(settings.value("state").toByteArray());    

    //Крепим возможности из меню
    features.insert("Save",  ui->aSave);
    features.insert("SaveAs",ui->aSaveAs);
    features.insert("ExportImage", ui->aExportImage);
    features.insert("Copy",ui->aCopy);
    features.insert("Cut",ui->aCut);
    features.insert("Paste",ui->aPaste);
    features.insert("Emulate",ui->aEmulate);
    features.insert("Generators",ui->aGenerators);
    features.insert("Impulses",ui->aImpulses);
    features.insert("Watches",ui->aWatches);

    //Крепим панели инструментов
    toolBars.insert("SchemeTools",ui->SchemeTools);
    toolBars.insert("FluffyTools",ui->FluffyTools);

    //Инструменты с панелей
    features.insert("Mouse",ui->actionMouse);
    features.insert("SaveDoc",ui->aSaveDoc);
    features.insert("OpenDoc",ui->aOpenDoc);

    features.insert("SWire",ui->aWireTool);
    features.insert("SRegion",ui->aRegionTool);
    features.insert("SText",ui->aTextTool);
    features.insert("Analyze",ui->aAnalyze);
    //... Добавить остальные инструменты

    //Выключаем все
    disableFeatures();
}

MainWindow::~MainWindow()
{
    ui->mdiArea->closeAllSubWindows();
    delete ui;
}

//Открываем дочернее окно в mdi области
void MainWindow::openMdiTab(SubjectWindow *win)
{
    ui->mdiArea->addSubWindow(win);
    win->showMaximized();
}

//Закрытие окна
void MainWindow::closeEvent(QCloseEvent *event)
{
    QMessageBox::StandardButton ret = QMessageBox::information(this,
                 tr("Application"),
                 tr("Do you want to exit?"),
                 QMessageBox::Ok | QMessageBox::Cancel);
    if (ret == QMessageBox::Ok)
    {
        //Сохраняем состояние главного окна
        QSettings settings(companyName, appicationName);
        settings.setValue("geometry", saveGeometry());
        settings.setValue("state", saveState());
        //Выход
        event->accept();
    }
    else if (ret == QMessageBox::Cancel)
        event->ignore();
}

//Отключаем элементы меню
void MainWindow::disableFeatures()
{
    QMap<QString, QAction*>::const_iterator i;
    for (i = features.constBegin(); i != features.constEnd(); i++)
    {
        i.value()->setEnabled(false);
    }
    QMap<QString, QToolBar*>::const_iterator j;
    for (j = toolBars.constBegin(); j != toolBars.constEnd(); j++)
    {
        j.value()->setVisible(false);
    }
}

//# События меню

//Закрытие документа
void MainWindow::closeMdiTab(int i)
{
    disableFeatures();
    QMdiSubWindow *sub = ui->mdiArea->subWindowList()[i];
    sub->close();
    delete sub;
}

//Создать схему
void MainWindow::createSchemeClick()
{
    openMdiTab( new SchemeWindow(NULL) );
}

//Создать векторное изображение
void MainWindow::createImageClick()
{
    openMdiTab( new FluffyWindow() );
}

//Открыть страницу багтрекера
void MainWindow::reportBugClick()
{
    QUrl url(bugTrackerUrl);
    QDesktopServices::openUrl(url);
}

//Показать информацию о программе
void MainWindow::aboutClick()
{
    AboutWindow about;
    about.exec();
}

//Открыть документ в текущем редакторе
void MainWindow::openDoc()
{
    QMdiSubWindow* sub = ui->mdiArea->activeSubWindow();
    if (sub)
    {
        SubjectWindow* win = dynamic_cast<SubjectWindow*>(sub);
        if (win)
            win->open();
    }
}

//Сохранить документ
void MainWindow::saveDoc()
{
    QMdiSubWindow* sub = ui->mdiArea->activeSubWindow();
    if (sub)
    {
        SubjectWindow* win = dynamic_cast<SubjectWindow*>(sub);
        if (win)
            win->save();
    }
}

//# Другие события

//Установка флажка видимости панели элементов
void MainWindow::elementsVisibleChanged(bool visiblity)
{
    ui->aShowElementsTools->setChecked(visiblity);
}

//Активация дочернего окна
void MainWindow::subWindowActivated(QMdiSubWindow *sub)
{
    SubjectWindow* win = dynamic_cast<SubjectWindow*>(sub);
    if (win)
    {
        //Включаем указанные окном возможности
        QMap<QString, QAction*>::const_iterator i;
        for (i = features.constBegin(); i != features.constEnd(); i++)
        {
            bool enabled = win->features.contains(i.key());
            i.value()->setEnabled(enabled);
        }
        //Включаем панели инструментов
        QMap<QString, QToolBar*>::const_iterator j;
        for (j = toolBars.constBegin(); j != toolBars.constEnd(); j++)
        {
            bool visible = win->features.contains(j.key());
            j.value()->setVisible(visible);
        }
    }
}
